"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    :
@File    : 17、python的错误和异常.py
"""


# 语法错误  SyntaxError: invalid syntax
# num = 1
# if num > 1
#     print('num > 1')

# 逻辑错误
num = 1
if num >= 1:
    print('num < 1')


# 系统错误

"""
异常 ：
    1、程序执行过程中出现的未知错误
    2、语法和逻辑都是正确的
    3、程序业务逻辑不完善引起的程序漏洞
异常与错误 ：
    1、异常可以捕获和处理
    2、错误一般是编码错误，逻辑错误，系统错误
常见异常 ：
    除零类型、名称异常、索引异常、键异常、值异常、属性异常等
"""


# 除零异常  ZeroDivisionError: division by zero
def div(a,b):
    return a / b

c = div(1,0)
print(c)


# 名称异常   NameError: name 'a' is not defined
print(a + 1)

# 索引异常   IndexError: string index out of range
b = 'abc'
print(b[12])


# 键异常   KeyError: 'age'
dict1 = {'name':'MackJia'}
print(dict1['age'])

# 值异常    ValueError: invalid literal for int() with base 10: 'aaa'
num = 'aaa'
print(int(num))


# 捕获异常
try:
    print(div(1,3))
except Exception as e:
    print(f'抛出异常: {e}')
# else没有异常时执行的代码
else:
    print('没有异常执行的代码块')
finally:
    print('不管有没有异常，最后都会执行finally语句')




# raise 主动抛出异常
def set_age(num):
    if num < 0 or num > 200:
        # 结果为 ValueError: 错误的值为：-2
        raise ValueError(f'错误的值为：{num}')
    else:
        print(f'输入的年龄为：{num}')
# 结果为 输入的年龄为：18
set_age(18)



# 自定义异常
class MyException(Exception):
    def __init__(self,msg):
        print(f'这是一个异常:{msg}')



def my_exception(num):
    if num < 0 or num > 200:
        # 结果为 __main__.MyException: 错误的值为：-2
        raise MyException(f'错误的值为：{num}')
    else:
        print(f'输入的年龄为：{num}')


my_exception(-2)
